// 最原始
// function request1(callback) {
//   // 0 也是异步
//   setTimeout(() => {
//     const result = "接口1的返回值";
//     callback && callback(result);
//   }, 300);
// }
// function request2(result,callback) {
//   setTimeout(() => {
//     const result = "接口2的返回值";
//     callback(result)
//   }, 300);
// }
// function request3(result,callback) {
//   setTimeout(() => {
//     const result = "接口3的返回值";
//     callback(result)
//   }, 250);
// }
// function getRequest() {
//   // 回调
//   request1(function(result1){
//     console.log(result1)
//     // 数据处理
//     request2(result1,function(result2){
//       console.log(result2)
//       //
//       request3(result2,function(result3){
//         // 好几百行
//         console.log(result3);
//       })
//     })
//   });
// }

// getRequest()

// Promise出现了

function request1() {
  // 0 也是异步
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const result = "接口1的返回值";
      if (result) {
        resolve(result);
      } else {
        reject(new Error("result没有结果"));
      }
    }, 300);
  });
}
function request2() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const result = "接口2的返回值";
      if (result) {
        resolve(result);
      } else {
        reject(new Error("result没有结果"));
      }
    }, 300);
  });
}
function request3() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const result = "接口3的返回值";
      if (result) {
        resolve(result);
      } else {
        reject(new Error("result没有结果"));
      }
    }, 300);
  });
}

// 任何的异步问题 都可以转换成Promise的问题
// 1. return new Promise((resolve,reject)=>{
//   2. 异步的结果里面要么调用resolve 要么调用reject
// })

// request1().then(res=>{return 结果},err=>{}).then(res=>) // 3.返回值是promise的实例 需要通过不断的.then处理结果 回调的返回值 下一个.then的参数
// request1().then((res) => {
//   request2(res).then((res2) => {
//     request3(res2).then((res3) => console.log(res3));
//   });
// });

// 终极就行
// async await
// 1. async 函数 匿名函数 : 在函数的额最前面加上async function (){}
// 2. await 后面要跟着promise实例  await 函数() 返回值 是Promise实例

async function getRequest() {
  const res1 = await request1();
  console.log(res1);
  const res2 = await request2(res1);
  console.log(res2);
  const res3 = await request3(res2);
  console.log(res3);
}
getRequest();

// 1. 回调 2. Promise 3. async await
// xhr请求
function xmlHttpRequest() {
  return new Promise((resolve, reject) => {
    // 1. 创建xhr对象
    const xhr = new XMLHttpRequest();
    // 2. 配置请求参数
    xhr.open("get", "http://sims.cuilb.cn/data.json");
    // 3. 发送请求
    xhr.send();
    // 4. 监听响应
    xhr.onreadystatechange = function () {
      if (xhr.readyState === 4 && xhr.status === 200) {
        console.log(xhr.responseText);
        resolve(xhr.responseText);
      }
    };
    // 错误
    xhr.onerror = function (err) {
      console.log(err);
      reject(new Error(err));
    };
  });
}

xmlHttpRequest().then(
  (res) => console.log(res),
  (err) => console.log(err)
);
